设置触发器

setTrigger('触发表单项名', '触发的值', '触发后显示的表单项名' [, '是否清除原有值'])

版本新增功能
1.0.6支持设置是否清除原有值

有时候,选择某些表单项或者填写某个值后,希望显示某些表单项,那么就可以用到触发器了,它可以让你很轻松就实现动态显示和隐藏某些表单项。

比如,我们希望用户选择“广州”之后,显示“邮编”和“电话”两个表单项,选择其他则隐藏这两项。

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. return ZBuilder::make('form')
  3. ->addSelect('city', '城市', '', $list_province)
  4. ->addText('zipcode', '邮编')
  5. ->addText('mobile', '电话')
  6. ->setTrigger('city', 'gz', 'zipcode,mobile')
  7. ->fetch();

这样设置之后,表单默认不会显示“邮编”和“电话”这两项内容,只有用户选择了“广州”之后,这两项才会显示,选择其他选项,则“邮编”和“电话”会隐藏起来,并清空内容。

也可以设置成,选择“广州”显示“邮编”,选择“深圳”显示“电话”。

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. return ZBuilder::make('form')
  3. ->addSelect('city', '城市', '', $list_province)
  4. ->addText('zipcode', '邮编')
  5. ->addText('mobile', '电话')
  6. ->setTrigger('city', 'gz', 'zipcode')
  7. ->setTrigger('city', 'sz', 'mobile')
  8. ->fetch();

上面的写法也可以用数组来设置

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. $trigger = [
  3. ['city', 'gz', 'zipcode'],
  4. ['city', 'sz', 'mobile'],
  5. ];
  6. return ZBuilder::make('form')
  7. ->addSelect('city', '城市', '', $list_province)
  8. ->addText('zipcode', '邮编')
  9. ->addText('mobile', '电话')
  10. ->setTrigger($trigger)
  11. ->fetch();

或者我们希望无论选择“广州”还是“深圳”,都显示“邮编”和“电话”。

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. return ZBuilder::make('form')
  3. ->addSelect('city', '城市', '', $list_province)
  4. ->addText('zipcode', '邮编')
  5. ->addText('mobile', '电话')
  6. ->setTrigger('city', 'gz,sz', 'zipcode,mobile')
  7. ->fetch();

也可以设置连续触发,比如,选择“广州”则显示“邮编”,“邮编”填写“123”则显示“电话”。

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. return ZBuilder::make('form')
  3. ->addSelect('city', '城市', '', $list_province)
  4. ->addText('zipcode', '邮编')
  5. ->addText('mobile', '电话')
  6. ->setTrigger('city', 'gz', 'zipcode')
  7. ->setTrigger('zipcode', '123', 'mobile')
  8. ->fetch();

触发表单项名

目前,触发表单项名仅支持下拉菜单(非多选)、单选、单行文本框这三种表单项类型。

触发的值

触发的值可以写一个,也可以写多个,多个值用逗号隔开。

触发后显示的表单项名

目前不支持普通联动、范围、拖动排序、静态文本这四种表单项类型。

注意,触发后显示的表单项名不能重复,比如下面的例子

  1. ->setTrigger('model', '2', 'content,detail_template')
  2. ->setTrigger('model', '3', 'list_template,detail_template')

原本我们的预期是,当model的值为2时显示content和detail_template,当model的值为3时显示list_template和detail_template。

但事实上当model的值为2时,detail_template会被隐藏,这是因为此时model不是3,所以list_template和detail_template会被隐藏。如果要达到预期的效果,需要改写下规则,将相同的表单项名写在同一个触发内。

  1. ->setTrigger('model', '2,3', 'detail_template')
  2. ->setTrigger('model', '2', 'content')
  3. ->setTrigger('model', '3', 'list_template')

这样就可以达到我们预期的效果了。

是否清除原有值(1.0.6+)

从1.0.6版本开始,支持设置是否清除原有值。在默认的情况下,会清除原有值。比如:

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. return ZBuilder::make('form')
  3. ->addSelect('city', '城市', '', $list_province)
  4. ->addText('zipcode', '邮编')
  5. ->addText('mobile', '电话')
  6. ->setTrigger('city', 'gz', 'zipcode')
  7. ->setTrigger('zipcode', '123', 'mobile')
  8. ->fetch();

当城市的值发生改变时,它所关联的邮编(zipcode)会自动清除掉原有值,如果不希望被清除掉,可以添加第四个参数为false。

  1. $list_province = ['gz' => '广州', 'sz' => '深圳', 'sh' => '上海'];
  2. return ZBuilder::make('form')
  3. ->addSelect('city', '城市', '', $list_province)
  4. ->addText('zipcode', '邮编')
  5. ->addText('mobile', '电话')
  6. ->setTrigger('city', 'gz', 'zipcode', false)
  7. ->setTrigger('zipcode', '123', 'mobile')
  8. ->fetch();

这样,不管城市的值如何变,邮编原有的值不会被清除。